home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2109 / 2109.xpi / chrome / febe.jar / content / boxnet.js < prev    next >
Text File  |  2009-10-23  |  40KB  |  1,091 lines

  1. // author: Chuck Baker
  2. // contact: febe@customsoftwareconsult.com
  3. // Version 6.3
  4.  
  5. // Get pointer to preferences 
  6.     try{
  7.         var febePrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("");
  8.     }catch(e){
  9.         var msg = febeMsg[169];
  10.         febeFatal(e,msg);}
  11.  
  12. var febeBoxKey = "nyusp9iniip8inoiau41uay4ygttlsku";
  13. var febeAuthToken, febeFolderID, febeBoxMessages = [], febeBoxNodeList = [], febeUploadFileCount, febeUploadFileSize, febeUploadFileList = [];
  14. var febeDispBoxUploadWindow = febePrefs.getBoolPref("extensions.febe.boxnet.uploadwindow");
  15.  
  16. function febeUploadBackup(){
  17.     febeMainWindow.febeSetMsgs();
  18.     window.document.title = febeMsg[238];
  19.     febeDispBoxUploadWindow = febePrefs.getBoolPref("extensions.febe.boxnet.uploadwindow");
  20.     
  21.     if(febeDispBoxUploadWindow){    // Load messages
  22.         febeMsg = window.arguments[0];    
  23.         window.document.title = febeMsg[238];
  24.     }else{
  25.         febeMsg = Application.storage.get("febeMsg", "");
  26.     }//if
  27.  
  28.     febeUploadAborted = false;
  29.  
  30.     var results = febeBoxLogin();
  31.     if(results == false)return false;
  32.     var resStatus = febeParseResp(results,"status");
  33.     if(resStatus != "logged"){
  34.         var tmp="<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[186]+"\n"+ resStatus;
  35.         febeAlert(tmp);
  36.         febeUploadAborted = true;
  37.         return false;
  38.     }//if
  39.     febeSetLocalizedDesc();
  40.     febeGetBoxMsg(results);
  41.     var tmp="<style>color: green; font-weight: bold; font-size: 15px;</style>"+febeMsg[185];
  42.     febeprt(febeMsg[185],"green");
  43.     febeprt(febeBoxMessages[0],"blue");
  44.     febeprt(febeBoxMessages[1],"blue");
  45.     febeprt(febeBoxMessages[2],"blue");
  46.     febeprt(febeBoxMessages[3],"blue");
  47.     febeprt(febeBoxMessages[4],"blue");
  48.     febeprt(febeBoxMessages[5],"blue");
  49.     febeprt(febeBoxMessages[6],"blue");
  50.     febeStartUploadBackup();
  51.     if(febeDispBoxUploadWindow){
  52.         var box = document.getElementById("messages");
  53.         box.contentDocument.close();
  54.     }//if
  55.     febeUploadClose();
  56.     febePrefs.setBoolPref("dom.disable_window_status_change", febeStatusSave);
  57.     return !febeUploadAborted;
  58. }//febeUploadBackup()
  59.  
  60. function febeSetLocalizedDesc(){
  61.     febeLocalizedStr["extension"] = febeMsg[244];
  62.     febeLocalizedStr["theme"] = febeMsg[245];
  63.     febeLocalizedStr["bookmarksJSON"] = febeMsg[246];
  64.     febeLocalizedStr["bookmarksHTML"] = febeMsg[279];
  65.     febeLocalizedStr["preferences"] = febeMsg[247];
  66.     febeLocalizedStr["cookies"] = febeMsg[248];
  67.     febeLocalizedStr["userChrome"] = febeMsg[249];
  68.     febeLocalizedStr["usernames-passwords"] = febeMsg[250];
  69.     febeLocalizedStr["searchPlugins"] = febeMsg[251];
  70.     febeLocalizedStr["history"] = febeMsg[252];
  71.     febeLocalizedStr["ffhistory"] = febeMsg[253];
  72.     febeLocalizedStr["permissions"] = febeMsg[254];
  73.     febeLocalizedStr["userDefined"] = febeMsg[255];
  74.     febeLocalizedStr["profile"] = febeMsg[256];
  75.     febeLocalizedStr["other"] = febeMsg[258];
  76.     febeLocalizedStr["directory"] = febeMsg[259];
  77.     febeLocalizedStr["size"] = febeMsg[260];
  78.     febeLocalizedStr["Uploading:"] = febeMsg[261];
  79.     febeLocalizedStr["uploaded ok"] = febeMsg[262];
  80.     febeLocalizedStr["Febe Backups"] = febeMsg[263];
  81.     febeLocalizedStr["Error:"] = febeMsg[264];
  82.     return true;
  83. }//febeSetLocalizedDesc()
  84.  
  85. function febeStartUploadBackup(){
  86.     var prefName = "extensions.febe.lastbackup.folder";
  87.     var lastBUfolder = febePreScanUpload();
  88.     if(!lastBUfolder){return false;}
  89.  
  90.     febeprt("<br>"+febeMsg[10]+" "+febeEscapeStr(lastBUfolder),"purple");
  91.     if(!febeCreateBoxFolder()){return false;}
  92.     var errCnt = 0;
  93.     var upCnt = 0;
  94.     var size = 0;
  95.     febeUploadProgress(upCnt,size);
  96.     for(var i in febeUploadFileList){
  97.         var entry = febeUploadFileList[i];
  98.         var results = febeUpload(entry);
  99.         if(results){
  100.             febeAddTags(results);
  101.             upCnt++;
  102.             size += entry.fileSize;
  103.             febeUploadProgress(upCnt,size);
  104.         }else{
  105.             errCnt++;
  106.         }//if
  107.     }//for
  108.     if(errCnt == 0){
  109.         var tmp = "<br><span style='color: blue; font-weight: bold; font-size: 15px;'>"+febeMsg[11]+" "+upCnt+" "+febeMsg[26]+"</span>";
  110.         febeprt(tmp,"purple");
  111.         var tmp = febeMsg[11]+" "+upCnt+" "+febeMsg[26];        
  112.     }else{
  113.         var tmp = "<style>color: red; font-weight: bold; font-size: 15px;</style>";
  114.         tmp += febeMsg[20];
  115.     }//if
  116.     if(Application.storage.get("backupOnShutdownCompleted", false)){
  117.         var application = Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup);
  118.         application.quit(application.eAttemptQuit);
  119.     }else{
  120.         febeAlert(tmp);
  121.     }//if
  122.     return true;
  123. }//febeStartUploadBackup()
  124.  
  125. function febeUploadProgress(cnt,size){
  126.     if(febeDispBoxUploadWindow){
  127.         var frame = document.getElementById("progressFrame");
  128.         var progressMeter = frame.contentDocument.getElementById("progressMeter");
  129.         var progressPct = frame.contentDocument.getElementById("progressPct");
  130.         var progressBox = frame.contentDocument.getElementById("progressBox");
  131.         var progressLabel = frame.contentDocument.getElementById("progressLabel");
  132.         var tmp = febeMsg[240].replace("%CNT%",cnt);
  133.         var tmp = tmp.replace("%TOT%",febeUploadFileCount);
  134.         progressLabel.setAttribute("value",tmp);
  135.  
  136.         var percentComplete = parseInt(((size / febeUploadFileSize)*100));
  137.         progressMeter.setAttribute("value", percentComplete);
  138.         var tmp = febeMsg[241].replace("%PCT%",percentComplete+"%");
  139.         var size = Math.round(febeUploadFileSize / 1024);
  140.         var tmp = tmp.replace("%TOT%",size+"kb");
  141.         progressPct.setAttribute("value", tmp);
  142.         window.status = tmp;
  143.     }
  144.     return true;
  145. }//febeUploadProgress(u)
  146.  
  147. function febePreScanUpload(){
  148.     var prefName = "extensions.febe.lastbackup.folder";
  149.     var lastBUfolder = febeGetUnicharPref(prefName);
  150.     if(lastBUfolder == ""){
  151.         febeAlert(febeMsg[9]);
  152.         window.close();
  153.         febePrefs.setBoolPref("dom.disable_window_status_change", febeStatusSave);
  154.         return false;
  155.     }//if
  156.     febeUploadFileCount = 0;
  157.     febeUploadFileSize = 0;
  158.     
  159.     febeInitDir();
  160.     febeBuDesDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  161.     febeBuDesDir.initWithPath(lastBUfolder);
  162.     var entries = febeBuDesDir.directoryEntries;
  163.     while(entries.hasMoreElements()){
  164.         var entry = entries.getNext();   
  165.         entry.QueryInterface(Ci.nsILocalFile);
  166.         if(entry.isDirectory()) continue;    // Skip folders
  167.         febeUploadFileCount++;
  168.         febeUploadFileSize += entry.fileSize;
  169.         febeUploadFileList[entry.leafName] = entry;
  170.     }//while
  171.     return lastBUfolder;
  172. }//febePreScanUpload()()
  173.  
  174. function febeCreateBoxFolder(){
  175.     // Create the backup folder
  176.     var prefName = "extensions.febe.boxnet.rootdir";
  177.     var folderName= febeGetBoxRootDir();
  178.     var xmlstr = "<?xml version='1.0' encoding='UTF-8' ?>";
  179.     xmlstr += "<request>";
  180.     xmlstr += "<action>create_folder</action>";
  181.     xmlstr += "<api_key>"+febeBoxKey+"</api_key>";
  182.     xmlstr += "<auth_token>"+febeAuthToken+"</auth_token>";
  183.     xmlstr += "<parent_id>0</parent_id>";
  184.     xmlstr += "<name>"+folderName+"</name>";
  185.     xmlstr += "<share>0</share>";  // Set to "1" to publicly share
  186.     xmlstr += "</request>";
  187.  
  188.     var req = new XMLHttpRequest(); 
  189.     req.open('POST', 'http://www.box.net/api/1.0/xml', false); 
  190.     req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  191.     try{
  192.         req.send(xmlstr);
  193.     }catch(e){
  194.         febeUploadAborted = true;
  195.         return false;
  196.     }//try/catch
  197.     
  198.     var resp = req.responseText; 
  199.     var resStatus = febeParseResp(resp,"status");
  200.     var folderName = febeParseResp(resp,"folder_name");
  201.     febeFolderID = febeParseResp(resp,"folder_id")
  202.     switch(resStatus){
  203.         case "create_ok":
  204.             febeprt(febeMsg[121]+" "+febeEscapeStr(folderName), "green");
  205.             break;
  206.         case "s_folder_exists":
  207.             febeprt(febeMsg[122]+" "+febeEscapeStr(folderName)+ "  OK ", "Darkorange");
  208.             break;
  209.         default:
  210.             febeAlert(febeMsg[123]+" " + resStatus);
  211.             return false;
  212.     }//switch    
  213.  
  214.     // Create timestamp subfolder
  215.     if(!febePrefs.getBoolPref("extensions.febe.useTimestampedDirBn")){return true;}
  216.     var ts = febePrefs.getCharPref("extensions.febe.timestamp.format");
  217.     if(!febeVerifyTimestamp(ts)){return false;}
  218.     var folderName = febeMakeTimestampName(ts);
  219.     var xmlstr = "<?xml version='1.0' encoding='UTF-8' ?>";
  220.     xmlstr += "<request>";
  221.     xmlstr += "<action>create_folder</action>";
  222.     xmlstr += "<api_key>"+febeBoxKey+"</api_key>";
  223.     xmlstr += "<auth_token>"+febeAuthToken+"</auth_token>";
  224.     xmlstr += "<parent_id>"+febeFolderID+"</parent_id>";
  225.     xmlstr += "<name>"+folderName+"</name>";
  226.     xmlstr += "<share>0</share>";  // Set to "1" to publicly share
  227.     xmlstr += "</request>";
  228.  
  229.     var req = new XMLHttpRequest(); 
  230.     req.open('POST', 'http://www.box.net/api/1.0/xml', false); 
  231.     req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  232.     try{
  233.         req.send(xmlstr);
  234.     }catch(e){
  235.         febeUploadAborted = true;
  236.         return false;
  237.     }//try/catch
  238.  
  239.     var resp = req.responseText; 
  240.     var resStatus = febeParseResp(resp,"status");
  241.     febeFolderID = febeParseResp(resp,"folder_id")
  242.     switch(resStatus){
  243.         case "create_ok":
  244.             febeprt(febeMsg[121]+" "+febeEscapeStr(folderName), "green");
  245.             break;
  246.         case "s_folder_exists":
  247.             febeprt(febeMsg[122]+" "+febeEscapeStr(folderName)+ " : "+febeMsg[8], "red");
  248.             return false;
  249.         default:
  250.             febeAlert(febeMsg[123]+" " + resStatus);
  251.             return false;
  252.     }//switch    
  253.     
  254.     return true;
  255. }//febeCreateBoxFolder()
  256.  
  257. function febeAddTags(boxObj){
  258.     // Add a tag to the uploaded file
  259.     var tag, fname;
  260.     fname = boxObj.fName;
  261.     switch(true){
  262.         case Boolean(fname.match(/^.*\.xpi$/)):
  263.             tag = febeLocalizedStr["extension"];
  264.             break;
  265.         case Boolean(fname.match(/^.*\.jar$/)):
  266.             tag = febeLocalizedStr["theme"];
  267.             break;
  268.         case Boolean(fname.match(/^bookmarks{.*}\.json$/)):
  269.             tag = febeLocalizedStr["bookmarksJSON"];
  270.             break;
  271.         case Boolean(fname.match(/^bookmarks{.*}\.html$/)):
  272.             tag = febeLocalizedStr["bookmarksHTML"];
  273.             break;
  274.         case Boolean(fname.match(/^prefs{.*}\.js$/)):
  275.             tag = febeLocalizedStr["preferences"];
  276.             break;
  277.         case Boolean(fname.match(/^cookies{.*}\.json$/)):
  278.             tag = febeLocalizedStr["cookies"];
  279.             break;
  280.         case Boolean(fname.match(/^userChrome{.*}\.fbu$/)):
  281.             tag = febeLocalizedStr["userChrome"];
  282.             break;
  283.         case Boolean(fname.match(/^usernames-passwords{.*}\.json$/)):
  284.             tag = febeLocalizedStr["usernames-passwords"];
  285.             break;
  286.         case Boolean(fname.match(/^searchPlugins{.*}\.fbu$/)):
  287.             tag = febeLocalizedStr["searchPlugins"];
  288.             break;
  289.         case Boolean(fname.match(/^history{.*}\.json$/)):
  290.             tag = febeLocalizedStr["history"];
  291.             break;
  292.         case Boolean(fname.match(/^ffhistory{.*}\.json$/)):
  293.             tag = febeLocalizedStr["ffhistory"];
  294.             break;
  295.         case Boolean(fname.match(/^permissions{.*}\.json$/)):
  296.             tag = febeLocalizedStr["permissions"];
  297.             break;
  298.         case Boolean(fname.match(/^profileFx[\d]{.*}\.fbu$/)):
  299.             tag = febeLocalizedStr["profile"];
  300.             break;
  301.         default:
  302.             febeUDBuInit();
  303.             for(var i in febeUDBuList){
  304.                 udBuName = i+"{"+febeProfName+"}"
  305.                 if(fname.indexOf(udBuName) == 0){    // Not the best way to do this, but it will have to do for now.
  306.                     tag = febeLocalizedStr["userDefined"];
  307.                     break;
  308.                 }//if
  309.             }//for
  310.             if(!tag){tag = febeLocalizedStr["other"];}
  311.             break;
  312.     }//switch
  313.  
  314.     var xmlstr = "<?xml version='1.0' encoding='UTF-8' ?>";
  315.     xmlstr += "<request>";
  316.     xmlstr += "<action>add_to_tag</action>";
  317.     xmlstr += "<api_key>"+febeBoxKey+"</api_key>";
  318.     xmlstr += "<auth_token>"+febeAuthToken+"</auth_token>";
  319.     xmlstr += "<tags><item>"+tag+"</item></tags>";
  320.     xmlstr += "<target>file</target>";
  321.     xmlstr += "<target_id>"+boxObj.targetID+"</target_id>";
  322.     xmlstr += "</request>";
  323.     var req = new XMLHttpRequest(); 
  324.     req.open('POST', 'http://www.box.net/api/1.0/xml', false); 
  325.     req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  326.     try{
  327.         req.send(xmlstr);
  328.     }catch(e){
  329.         febeUploadAborted = true;
  330.         return false;
  331.     }//try/catch
  332.  
  333.     var resp = req.responseText; 
  334.     var resStatus = febeParseResp(resp,"status");
  335.     switch(resStatus){
  336.         case "addtotag_ok":
  337.             febeprt(febeMsg[199].replace("%TAG%",tag),"green");
  338.             break;
  339.         default:
  340.             febeAlert(febeMsg[200].replace("%FILE%",boxObj.fName)+"\n"+resStatus);
  341.             return false;
  342.     }//switch    
  343.  
  344.     return true;
  345. }//febeAddTags()
  346.  
  347. function febeUpload(nsFilename){
  348.     var uploadName = nsFilename.leafName;    
  349.     febeprt("<br>"+febeMsg[21]+" "+febeEscapeStr(uploadName),"purple")
  350.  
  351.     // Buffer the upload file
  352.     var inStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  353.     inStream.init(nsFilename, 1, 1, inStream.CLOSE_ON_EOF);
  354.     var bufInStream = Cc["@mozilla.org/network/buffered-input-stream;1"].createInstance(Ci.nsIBufferedInputStream);
  355.     bufInStream.init(inStream, 4096);
  356.     
  357.     //Setup the boundry start stream
  358.     var boundary = "--F-E-B-E--U-p-l-o-a-d-------------" + Math.random();
  359.     var startBoundryStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
  360.     startBoundryStream.setData("\r\n--"+boundary+"\r\n",-1);
  361.     
  362.     // Setup the boundry end stream
  363.     var endBoundryStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
  364.     endBoundryStream.setData("\r\n--"+boundary+"--",-1);
  365.     
  366.     // Setup the mime-stream - the 'part' of a multi-part mime type
  367.     var mimeStream = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci.nsIMIMEInputStream);
  368.     mimeStream.addContentLength = false;
  369.     mimeStream.addHeader("Content-disposition","form-data; charset: utf-8; accept-charset: utf-8; name=\""+uploadName+"\"; filename=\""+uploadName+"\"");
  370.     mimeStream.addHeader("Content-type","multipart/form-data; charset: utf-8; accept-charset: utf-8;");
  371.     mimeStream.setData(bufInStream);
  372.  
  373.     // Setup a multiplex stream
  374.     var multiStream = Cc["@mozilla.org/io/multiplex-input-stream;1"].createInstance(Ci.nsIMultiplexInputStream);
  375.     multiStream.appendStream(startBoundryStream);
  376.     multiStream.appendStream(mimeStream);
  377.     multiStream.appendStream(endBoundryStream);
  378.     var size = Math.round(nsFilename.fileSize / 1024);
  379.     febeprt(febeLocalizedStr["Uploading:"]+" "+febeEscapeStr(uploadName)+"   "+febeEscapeStr(size.toString())+"kb");
  380.     var uri = 'http://upload.box.net/api/1.0/upload/'+febeAuthToken+'/'+febeFolderID;
  381.     var req = new XMLHttpRequest(); 
  382.     req.open('POST', uri, false); 
  383.     req.setRequestHeader("Content-length",multiStream.available());
  384.     req.setRequestHeader("Content-type","multipart/form-data;  charset: utf-8; accept-charset: utf-8; boundary="+boundary);
  385.     req.onload = function(event) {
  386.         var tmp = "Response detail: '"+febeAddEntities(event.target.responseText)+"'\n"
  387.         //febeprt(tmp,"Fuchsia");
  388.         //alert(event.target.responseText)
  389.     }
  390.     
  391.     try{
  392.         req.send(multiStream);
  393.     }catch(e){
  394.         febeUploadAborted = true;
  395.         febeprt(febeLocalizedStr["Error:"]+" "+febeWrap(e,100),"red")
  396.         return false;
  397.     }//try/catch
  398.     return febeBoxUploadDone(req,uploadName);
  399. }//febeUpload()
  400.  
  401. function febeAddEntities(myString){
  402.      var xmlString = myString.split("<").join("<");
  403.      xmlString = xmlString.split(">").join(">");
  404.      xmlString = xmlString.split("\"").join(""");
  405.      xmlString = xmlString.split("\'").join("'");
  406.      return xmlString;
  407. }
  408.  
  409. function febeBoxUploadDone(req,uploadName){
  410.     var resp = req.responseText; 
  411.     var resStatus = febeParseResp(resp,"status");
  412.     
  413.     switch(resStatus){
  414.         case "upload_ok":
  415.             febeprt(febeEscapeStr(uploadName)+" "+febeLocalizedStr["uploaded ok"],"green");    
  416.             var resp = req.responseText; 
  417.             var domParser = new DOMParser();
  418.             var xmldoc = domParser.parseFromString(resp, "text/xml");
  419.             var response = xmldoc.getElementsByTagName('response')[0];
  420.             var files = response.getElementsByTagName("files")[0].firstChild
  421.             var id = files.getAttribute("id");
  422.             var fname = files.getAttribute("file_name");
  423.             var boxObj = new Object();
  424.             boxObj.targetID = id;
  425.             boxObj.fName = fname;
  426.             return boxObj;
  427.             break;
  428.         case "upload_some_files_failed":
  429.             var resp = req.responseText; 
  430.             var domParser = new DOMParser();
  431.             var xmldoc = domParser.parseFromString(resp, "text/xml");
  432.             var response = xmldoc.getElementsByTagName('response')[0];
  433.             var files = response.getElementsByTagName("files")[0].firstChild
  434.             var err = files.getAttribute("error");
  435.             var fname = files.getAttribute("file_name");
  436.             febeprt(febeMsg[124]+" "+febeEscapeStr(fname)+": "+febeEscapeStr(err)+febeMsg[105], "red");
  437.             return false;
  438.             break;
  439.         default:
  440.             var tmp = febeLocalizedStr["Error:"]+"\n["+req.responseText+"]\n["+uploadName+"]\n"
  441.             tmp += febeMsg[280]+" '"+resp+"/"+resStatus+"'\n"
  442.             febeprt(tmp,"red");
  443.             febeAlert(tmp);
  444.             return false;
  445.     }//switch    
  446.     return true;
  447. }//febeBoxUploadDone()
  448.  
  449. function febeprt(txt,color){
  450.     if(!color) color="black";
  451.     var prtStr = "<span style='font-family: Courier New,Courier,monospace; font-size:12px; color: "+color+";'>";
  452.     prtStr += txt+"<br></span>";
  453.     if(febeDispBoxUploadWindow){
  454.         var box = document.getElementById("messages");
  455.         box.contentDocument.write(prtStr);
  456.         var scrollBox = box.contentWindow.document.body;
  457.         scrollBox.scrollTop = scrollBox.scrollHeight - scrollBox.clientHeight
  458.     }//
  459.     return true;
  460. }//febeprt()
  461.  
  462. function febeEscapeStr(str){
  463.   // Replace certain HTML characters with entities
  464.   str = str.replace(/&/g, "&");
  465.   str = str.replace(/</g,"<");
  466.   str = str.replace(/>/g, ">");
  467.   return str;
  468. }//febeEscapeStr()
  469.  
  470. function febeParseResp(resp,which){
  471.     var domParser = new DOMParser();
  472.     var xmldoc = domParser.parseFromString(resp, "text/xml");
  473.     var value;
  474.     try{
  475.         value = xmldoc.getElementsByTagName(which)[0].firstChild.nodeValue;
  476.     }catch(e){value = false;}
  477.     return value;
  478. }//febeParseResp
  479.  
  480. function onProgress(e) {
  481.   var percentComplete = (e.position / e.totalSize)*100;
  482.   return
  483. }
  484.  
  485. function febeTestBN(){
  486.   // Test Box.net login - 
  487.     febeSetMsgs();
  488.     var results = febeBoxLogin();
  489.     if(results == false)return false;
  490.     var resStatus = febeParseResp(results,"status");
  491.     if(resStatus != "logged"){
  492.         var tmp="<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[186]+"\n"+ resStatus;
  493.         febeAlert(tmp);
  494.         return false;
  495.     }//if
  496.     febeGetBoxMsg(results);
  497.     var tmp="<style>color: green; font-weight: bold; font-size: 15px;</style>"+febeMsg[185];
  498.     tmp += "\n"+febeBoxMessages[0]+"\n";
  499.     tmp += "\n"+febeBoxMessages[1];
  500.     tmp += "\n"+febeBoxMessages[2];
  501.     tmp += "\n"+febeBoxMessages[3];
  502.     tmp += "\n"+febeBoxMessages[4];
  503.     tmp += "\n"+febeBoxMessages[5];
  504.     tmp += "\n"+febeBoxMessages[6];
  505.     febeAlert(tmp);
  506.     febeBoxLogout();
  507.     return true;
  508. }//febeTestBN()
  509.  
  510. function febeGetBoxMsg(xml){
  511.     febeBoxMessages = [];
  512.     var login = febeParseResp(xml,"login");
  513.     var email = febeParseResp(xml,"email");
  514.     var user_id = febeParseResp(xml,"user_id");
  515.     var capacity = febeParseResp(xml,"space_amount");
  516.     var space_used = febeParseResp(xml,"space_used");
  517.     var max_upload_size = febeParseResp(xml,"max_upload_size");
  518.     febeBoxMessages.push(febeMsg[192]+" "+login);
  519.     febeBoxMessages.push(febeMsg[193]+" "+email);
  520.     febeBoxMessages.push(febeMsg[194]+" "+user_id);
  521.     
  522.     var mb = 1048576;
  523.     var boxCapacity = parseInt(capacity) / mb;
  524.     boxCapacity = Math.round(boxCapacity * 100);
  525.     boxCapacity = parseInt(boxCapacity) / 100; 
  526.     var spaceUsed = parseInt(space_used) / mb;
  527.     spaceUsed = Math.round(spaceUsed * 100);
  528.     spaceUsed = parseInt(spaceUsed) / 100; 
  529.     var spaceAvailable = boxCapacity - spaceUsed;
  530.     var maxUpload = parseInt(max_upload_size) / mb;
  531.     febeBoxMessages.push(febeMsg[195]+" "+boxCapacity+" MB");
  532.     febeBoxMessages.push(febeMsg[196]+" "+spaceUsed+" MB");
  533.     febeBoxMessages.push(febeMsg[197]+" "+spaceAvailable+" MB");
  534.     febeBoxMessages.push(febeMsg[198]+" "+maxUpload+" MB");
  535.     return true;
  536. }//febeGetBoxMsg()
  537.     
  538. function febeLoginMgrObj(username, password){
  539.     this.hostname = 'chrome://FEBE {Box.net login}'; 
  540.     this.formSubmitURL = 'Box.net login'; 
  541.     this.httprealm = null;
  542.     this.username = username;
  543.     this.password = password;
  544.     var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1", Components.interfaces.nsILoginInfo, "init"); 
  545.     return new nsLoginInfo(this.hostname, this.formSubmitURL, this.httprealm, this.username, this.password, "", "");
  546. }//febeLoginMgrObj()
  547.  
  548. function febeGetBNpassword(username){
  549.   // Return box.net password or null
  550.     var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
  551.     var password; 
  552.     var login = febeLoginMgrObj(username, password)
  553.     
  554.     try { 
  555.         var logins = loginManager.findLogins({}, login.hostname, login.formSubmitURL, login.httprealm); 
  556.         // Find user from returned array of nsILoginInfo objects 
  557.         for (var i = 0; i < logins.length; i++) { 
  558.             if (logins[i].username == username) { 
  559.                 password = logins[i].password; 
  560.                 return password;
  561.                 break; 
  562.             }//if 
  563.         }//for
  564.     } catch(ex) { 
  565.             return null;
  566.     }//try
  567.  
  568. }//febeGetBNpassword()
  569.  
  570. function febeDisableBoxCheck(){
  571.     var enabled = document.getElementById("box_net_enable").checked;
  572.     document.getElementById("box_net_info").hidden = !enabled;
  573.         
  574.     var prefName = "extensions.febe.boxnet.username";
  575.     var uName = febePrefs.getCharPref(prefName);
  576.     document.getElementById("bn_password").value = febeGetBNpassword(uName);
  577.     
  578.     var prefName = "extensions.febe.lastbackup";
  579.     var tmp = febePrefs.getCharPref(prefName);
  580.     var lastBU = false;
  581.     if(tmp != "") lastBU = true;
  582.  
  583.     
  584.     if(uName != ""){    // Disable entry if it already exists - Enabled with "Reset login" button
  585.         document.getElementById("bn_username").disabled = true;
  586.         document.getElementById("bn_password").disabled = true;
  587.         document.getElementById("bn_save").disabled = true;
  588.         document.getElementById("bn_test").disabled = false;
  589.         document.getElementById("bn_upload").disabled = !lastBU;
  590.         document.getElementById("bn_view").disabled = false;
  591.         document.getElementById("box_net_autoupload").disabled = false;
  592.     }else{
  593.         document.getElementById("bn_test").disabled = true;
  594.         document.getElementById("bn_upload").disabled = true;
  595.         document.getElementById("bn_view").disabled = true;
  596.         document.getElementById("bn_save").disabled = false;
  597.         document.getElementById("box_net_autoupload").disabled = true;
  598.         document.getElementById("box_net_autoupload").checked = false;
  599.         document.getElementById("bn_password").value = "";
  600.     }//if
  601.     return true;
  602. }//febeDisableBoxCheck()
  603.  
  604. function febeUploadAbort(){
  605.     var tmp = "<style>color: red; font-weight: bold; font-size: 15px;</style>";
  606.     tmp += febeMsg[8];
  607.     //febeAlert(tmp);
  608.     return true;
  609. }//febeUploadAbort()
  610.  
  611. function febeUploadClose(){
  612.     if(febeUploadAborted) febeUploadAbort();
  613.     febeBoxLogout();
  614.     febePrefs.setBoolPref("dom.disable_window_status_change", febeStatusSave);
  615.     return true;
  616. }//febeUploadClose()
  617.  
  618. function febeBoxLogout(){
  619.     var req = new XMLHttpRequest();
  620.     var str = 'http://www.box.net/api/1.0/rest?action=logout&api_key='+febeBoxKey+'&auth_token='+febeAuthToken;
  621.     req.open('GET',str, false);
  622.     req.send(null);
  623.     var resp = req.responseText;     
  624.     var resStatus = febeParseResp(resp,"status");
  625.     if (resStatus != "logout_ok"){
  626.         var tmp="<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[190]+"\n"+ febeMsg[189]+" "+resStatus;
  627.         febeAlert(tmp);            
  628.         return false;
  629.     }//if
  630.     return true;
  631. }//febeBoxLogout()
  632.  
  633. function febeResetBN(){
  634.     febeClearLogin()
  635.     document.getElementById("bn_username").disabled = false;
  636.     document.getElementById("bn_username").value = "";
  637.     document.getElementById("bn_password").disabled = false;
  638.     document.getElementById("bn_password").value = "";
  639.     
  640.     document.getElementById("bn_test").disabled = true;
  641.     document.getElementById("bn_upload").disabled = true;
  642.     document.getElementById("bn_view").disabled = true;
  643.     document.getElementById("bn_save").disabled = false;
  644.     document.getElementById("box_net_autoupload").disabled = true;
  645.     document.getElementById("box_net_autoupload").checked = false;
  646.     febePrefs.setBoolPref("extensions.febe.boxnet.autoupload",false);
  647.     
  648.     febePrefs.setCharPref("extensions.febe.boxnet.username","");
  649.     febePrefs.setCharPref("extensions.febe.boxnet.password","");
  650.     
  651.     document.getElementById("bn_username").focus();
  652. }//febeResetBN()
  653.  
  654. function febeSaveBN(){
  655.     var uName = document.getElementById("bn_username").value;
  656.     var password = document.getElementById("bn_password").value;
  657.     if(password == "" || uName == ""){
  658.         febeAlert(febeMsg[187]);
  659.         if(uName == "") document.getElementById("bn_username").focus();
  660.         if(password == "") document.getElementById("bn_password").focus();
  661.         if(password == "" || uName == "") document.getElementById("bn_username").focus();
  662.         return false;
  663.     }//if
  664.     var loginInfo = new febeLoginMgrObj(uName, password);
  665.     Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager).addLogin(loginInfo);
  666.     
  667.     febePrefs.setCharPref("extensions.febe.boxnet.username",uName);
  668.     febePrefs.setCharPref("extensions.febe.boxnet.password","<encrypted>");
  669.     document.getElementById("bn_test").disabled = false;
  670.     document.getElementById("bn_upload").disabled = false;
  671.     document.getElementById("bn_view").disabled = false;
  672.     document.getElementById("bn_save").disabled = true;
  673.     document.getElementById("box_net_autoupload").disabled = false;
  674.     return true;
  675. }//febeSaveBN()
  676.  
  677. function febeClearLogin(){
  678.   // Remove all FEBE box.net logins
  679.     var hostname = 'chrome://FEBE {Box.net login}';
  680.     var formSubmitURL = 'Box.net login';
  681.     var httprealm = null;
  682.     var passwordManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
  683.     var logins = passwordManager.findLogins({}, hostname, formSubmitURL, httprealm);
  684.       
  685.     for (var i = 0; i < logins.length; i++) {
  686.         if (logins[i].hostname == hostname) {
  687.             passwordManager.removeLogin(logins[i]);
  688.             break;
  689.         }//if
  690.     }//for
  691.     return true;
  692. }//febeClearLogin()
  693.  
  694. function febeViewBoxFolder(){
  695.     febeBoxLogin();
  696.     febeOpenLink('http://www.box.net/files');
  697.     return true;
  698. }//febeViewBoxFolder()
  699.  
  700. function febeBoxLogin(){
  701.     var prefName = "extensions.febe.boxnet.username";
  702.     var bnUsername = febePrefs.getCharPref(prefName); 
  703.     var bnPassword = febeGetBNpassword(bnUsername);
  704.     var method = "";
  705.     var k = "&api_key=" + febeBoxKey;
  706.     var l = "&login=" + encodeURIComponent(bnUsername);
  707.     var p = "&password=" + encodeURIComponent(bnPassword); 
  708.     var m = "&method=";
  709.  
  710.     var req = new XMLHttpRequest(); 
  711.     req.open('GET', 'http://www.box.net/api/1.0/rest?action=authorization' + k + l + p + m, false); 
  712.     req.onreadystatechange = function (aEvt) {
  713.         var r = req.readyState;
  714.         var s = req.status;
  715.         if (req.readyState != 4 || req.status != 200) {
  716.             var tmp="<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[188]+"\n"+ febeMsg[189]+" "+resStatus;
  717.             febeAlert(tmp);            
  718.             return false;
  719.         }//if
  720.     };
  721.     req.send(null);
  722.     var results = req.responseText;
  723.     febeAuthToken = febeParseResp(results,"auth_token");
  724.     return results;
  725. }//febeBoxLogin()
  726.  
  727. function febeGetOnlineTree(){
  728.     febeMsg = window.arguments[0];    // Load messages
  729.     febeSetLocalizedDesc();
  730.     var filter = Application.storage.get("type", "");
  731.     filter = febeLocalizedStr[filter];    // Localized type description
  732.     document.title += ": "+filter;
  733.   // Get file tree
  734.     if(febeBoxLogin() == false){return false;}
  735.     
  736.     // Get a list of tags
  737.     var febeBoxTags = {};
  738.     var xmlstr = "<?xml version='1.0' encoding='UTF-8' ?>";
  739.     xmlstr += "<request>";
  740.     xmlstr += "<action>export_tags</action>";
  741.     xmlstr += "<api_key>"+febeBoxKey+"</api_key>";
  742.     xmlstr += "<auth_token>"+febeAuthToken+"</auth_token>";
  743.     xmlstr += "</request>";
  744.     var req = new XMLHttpRequest(); 
  745.     req.open('POST', 'http://www.box.net/api/1.0/xml', false); 
  746.     req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  747.     try{
  748.         req.send(xmlstr);
  749.     }catch(e){
  750.         febeUploadAborted = true;
  751.         return false;
  752.     }//try/catch
  753.  
  754.     var resp = req.responseText; 
  755.     var resStatus = febeParseResp(resp,"status");
  756.     switch(resStatus){
  757.         case "export_tags_ok":
  758.             var domParser = new DOMParser();
  759.             var xmldoc = domParser.parseFromString(resp, "text/xml");
  760.             var response = xmldoc.getElementsByTagName('response')[0];
  761.             var tags = response.getElementsByTagName("tag");
  762.             for(var i in tags){
  763.                 try{
  764.                     var tname = tags[i].textContent;                
  765.                     var id = tags[i].attributes["id"].value;
  766.                     febeBoxTags[id] = tname;
  767.                 }catch(e){;}
  768.             }//for
  769.             break;
  770.         default:
  771.             febeAlert(febeMsg[201]+"\n"+resStatus);
  772.             return false;
  773.     }//switch    
  774.  
  775.     // Get tree
  776.     var xmlstr = "<?xml version='1.0' encoding='UTF-8' ?>";
  777.     xmlstr += "<request>";
  778.     xmlstr += "<action>get_account_tree</action>";
  779.     xmlstr += "<api_key>"+febeBoxKey+"</api_key>";
  780.     xmlstr += "<auth_token>"+febeAuthToken+"</auth_token>";
  781.     xmlstr += "<folder_id>0</folder_id>";
  782.     xmlstr += "<params><item>nozip</item></params>";
  783.     xmlstr += "</request>";
  784.     var req = new XMLHttpRequest(); 
  785.     req.open('POST', 'http://www.box.net/api/1.0/xml', false); 
  786.     req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  787.     try{
  788.         req.send(xmlstr);
  789.     }catch(e){
  790.         febeUploadAborted = true;
  791.         return false;
  792.     }//try/catch
  793.  
  794.     var resp = req.responseText; 
  795.     var resStatus = febeParseResp(resp,"status");
  796.     switch(resStatus){
  797.         case "listing_ok":
  798.             break;
  799.         default:
  800.             febeAlert(febeMsg[202]+"\n"+resStatus);
  801.             return false;
  802.     }//switch    
  803. // OK, got the tree, now parse it
  804.     var tree = document.getElementById("febeRoot");
  805.     var parser = new DOMParser();
  806.     var dom = parser.parseFromString(resp, "text/xml");    
  807.     var tree = document.getElementById("boxNetTree");
  808.     var treeWalker = document.createTreeWalker(dom, 1, null, true);
  809.     var root, label;
  810.     
  811.     var titem = document.createElement('treeitem');
  812.     var trow = document.createElement('treerow');
  813.     var tcell = document.createElement('treecell');
  814.     var tchild = document.createElement('treechildren');
  815.     
  816.     // Create "Box.net" row
  817.     var boxRootChild = tchild.cloneNode(false);
  818.     boxRootChild.setAttribute('id', "boxRootChild");
  819.     tree.appendChild(boxRootChild);
  820.  
  821.     var titem = titem.cloneNode(false);
  822.     titem.setAttribute('id', "boxRoot");
  823.     titem.setAttribute('container', "true");
  824.     titem.setAttribute('open', "true");
  825.     var boxRoot = boxRootChild.appendChild(titem);
  826.     
  827.     var trow = trow.cloneNode(false);
  828.     var tcell = tcell.cloneNode(false);    
  829.     tcell.setAttribute('label', "Box.net");
  830.     trow.appendChild(tcell);
  831.     var tcell = tcell.cloneNode(false);    
  832.     tcell.setAttribute('label', "");
  833.     trow.appendChild(tcell);
  834.     var tcell = tcell.cloneNode(false);    
  835.     tcell.setAttribute('label', "");
  836.     trow.appendChild(tcell);
  837.     var tcell = tcell.cloneNode(false);    
  838.     tcell.setAttribute('label', febeLocalizedStr["directory"]);
  839.     trow.appendChild(tcell);
  840.     var tcell = tcell.cloneNode(false);    
  841.     tcell.setAttribute('label', febeLocalizedStr["size"]);
  842.     trow.appendChild(tcell);
  843.     boxRoot.appendChild(trow);
  844.     
  845.     // Create "FEBE backups" row
  846.     var FEBEbackupsChild = tchild.cloneNode(false);
  847.     FEBEbackupsChild.setAttribute('id', "FEBEbackupsChild");
  848.     boxRoot.appendChild(FEBEbackupsChild);
  849.     
  850.     var titem = titem.cloneNode(false);
  851.     titem.setAttribute('id', "FEBEbackups");
  852.     titem.setAttribute('container', "true");
  853.     titem.setAttribute('open', "true");
  854.     var FEBEbackups = FEBEbackupsChild.appendChild(titem);
  855.  
  856.     var trow = trow.cloneNode(false);
  857.     var tcell = tcell.cloneNode(false);    
  858.     tcell.setAttribute('label', febeLocalizedStr["Febe Backups"]);
  859.     trow.appendChild(tcell);
  860.     var tcell = tcell.cloneNode(false);    
  861.     tcell.setAttribute('label', "");
  862.     trow.appendChild(tcell);
  863.     var tcell = tcell.cloneNode(false);    
  864.     tcell.setAttribute('label', "");
  865.     trow.appendChild(tcell);
  866.     var tcell = tcell.cloneNode(false);    
  867.     tcell.setAttribute('label', febeLocalizedStr["directory"]);
  868.     trow.appendChild(tcell);
  869.     var tcell = tcell.cloneNode(false);    
  870.     tcell.setAttribute('label', "");
  871.     trow.appendChild(tcell);
  872.  
  873.     FEBEbackups.appendChild(trow);
  874.     
  875.     var backupItemsChild = tchild.cloneNode(false);
  876.     backupItemsChild.setAttribute('id', "backupItemsChild");
  877.     backupItemsChild = FEBEbackups.appendChild(backupItemsChild);
  878.     
  879.     while(treeWalker.nextNode()){
  880.         var n = treeWalker.currentNode;
  881.         var id = n.getAttribute("id");
  882.         febeBoxNodeList[id] = n;
  883.         var createdStr = n.getAttribute("created");
  884.         if(createdStr){
  885.             createdStr = createdStr.toString() + "000";
  886.             var createdInt = parseInt(createdStr);
  887.             var d = new Date(createdInt);            // Mon Oct 27 2008 16:36:40 GMT-0700 (US Mountain Standard Time) - object
  888.             var ds = d.toString();                    // "Mon Oct 27 2008 16:36:40 GMT-0700 (US Mountain Standard Time)"
  889.             ds = ds.substr(0,16);                    // "Mon Oct 27 2008 "
  890.             var dt = d.toLocaleTimeString()            // "4:36:40 PM"
  891.             var created = ds + dt;                    // "Mon Oct 27 2008 4:36:40 PM"
  892.         }//if
  893.         var sizeStr = n.getAttribute("size");
  894.         if(sizeStr){
  895.             var s = Math.round(parseInt(sizeStr) / 1024);
  896.             var size = s.toString()+"kb";
  897.         }//if
  898.  
  899.         switch(n.nodeName){
  900.             case "file":
  901.                 var ti = document.createElement('treeitem');
  902.                 ti.setAttribute('container', "false");
  903.                 var tcell = document.createElement('treecell');
  904.                     var tr = document.createElement('treerow');    
  905.                         var tc = tcell.cloneNode(false);
  906.                         label = n.getAttribute("file_name");
  907.                         tc.setAttribute('label', label);    // Name
  908.                         tr.appendChild(tc);
  909.                         
  910.                         var tc = tcell.cloneNode(false);
  911.                         tc.setAttribute('label', id);        // Id
  912.                         tc.setAttribute('hidden', "true");
  913.                         tr.appendChild(tc);
  914.                                                 
  915.                         var tc = tcell.cloneNode(false);    // Created
  916.                         tc.setAttribute('label', created);
  917.                         tr.appendChild(tc);
  918.  
  919.                         var tct = tcell.cloneNode(false);    // Type
  920.                         tct.setAttribute('label', "");
  921.                         tr.appendChild(tct);
  922.                         
  923.                         var tc = tcell.cloneNode(false);    //Size
  924.                         tc.setAttribute('label', size);
  925.                         tr.appendChild(tc);
  926.  
  927.                     ti.appendChild(tr);
  928.                 break;
  929.             case "tag":
  930.                 var tag = febeBoxTags[id];
  931.                 if(tag == filter){
  932.                     tct.setAttribute('label', tag);
  933.                     backupItemsChild.appendChild(ti);
  934.                 }//if
  935.                 break;
  936.             default:
  937.                 break;
  938.         }//switch
  939.     }//while
  940.     return true;
  941. }//febeGetOnlineTree(()
  942.  
  943. function febeViewDoc(elm){
  944.     var serializer = new XMLSerializer(); 
  945.     var xml = serializer.serializeToString(elm); 
  946.     var tmp = xml.replace(/></g,">\n<");
  947.     var content = document.getElementById("tb");
  948.     content.value = tmp;
  949.     return true;
  950. }
  951.  
  952. function febeDownloadBox(){
  953.     var tree = document.getElementById("boxNetTree");
  954.     var selection = tree.view.selection;
  955.     var name = tree.view.getCellText(tree.currentIndex, tree.columns.getColumnAt(0));
  956.     var id = tree.view.getCellText(tree.currentIndex, tree.columns.getColumnAt(1));
  957.     var type = tree.view.getCellText(tree.currentIndex, tree.columns.getColumnAt(3));
  958.     if(id == ""){return false;}
  959.     var progressMeter = document.getElementById("progressMeter");
  960.     var progressPct = document.getElementById("progressPct");
  961.     var progressBox = document.getElementById("progressBox");
  962.     var progressLabel = document.getElementById("progressLabel");
  963.     progressLabel.value = febeMsg[242].replace("%FILE%",type);
  964.     progressBox.setAttribute("hidden", "false");
  965.     
  966.   // Get file 
  967.     var results = febeBoxLogin();
  968.     if(results == false)return false;
  969.     var resStatus = febeParseResp(results,"status");
  970.     if(resStatus != "logged"){
  971.         var tmp="<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[186]+"\n"+ resStatus;
  972.         febeAlert(tmp);
  973.         return false;
  974.     }//if
  975.     
  976.     var url = 'http://box.net/api/1.0/download/'+febeAuthToken+'/'+id;
  977.     var filter = Application.storage.get("type", "");
  978.     if(filter == "extension" || filter == "theme"){
  979.         var xpi = new Object;
  980.         xpi[name] = url;
  981.         InstallTrigger.install(xpi);
  982.     }else{
  983.         var file = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile);
  984.         file.append("FEBE_Boxnet_restorefile");
  985.  
  986.         var wbp = Cc['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'].createInstance(Ci.nsIWebBrowserPersist);  
  987.         var nsIWBP = Components.interfaces.nsIWebBrowserPersist;
  988.         var flags = nsIWBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION | 
  989.                     nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
  990.                     nsIWBP.PERSIST_FLAGS_BYPASS_CACHE;        
  991.         wbp.persistFlags = flags;
  992.         var ios = Cc['@mozilla.org/network/io-service;1'].getService(Ci.nsIIOService);  
  993.         var uri = ios.newURI(url, null, null);  
  994.         const febeCi = Components.interfaces;
  995.         wbp.progressListener = {
  996.             onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {
  997.                 var percentComplete = parseInt((aCurTotalProgress/aMaxTotalProgress)*100);
  998.                 progressMeter.setAttribute("value", percentComplete);
  999.                 progressPct.setAttribute("value", percentComplete+"%");
  1000.                 },
  1001.  
  1002.             onStateChange: function( aWebProgress, aRequest, aStateFlags, aStatus, aDownload ) {
  1003.                 if (aStateFlags & febeCi.nsIWebProgressListener.STATE_STOP){
  1004.                     febeDump("Download done");
  1005.                     Application.storage.set("created", febeBoxNodeList[id].getAttribute("created") + "000");
  1006.                     Application.storage.set("boxname", febeBoxNodeList[id].getAttribute("file_name"));
  1007.                     Application.storage.set("name", file.leafName);
  1008.                     Application.storage.set("location", file.path);
  1009.                     Application.storage.set("parent", file.parent.path);
  1010.                     Application.storage.set("abort", false);
  1011.                     Application.storage.set("url", url);
  1012.                     window.close();
  1013.                     return true;
  1014.                 }//if
  1015.             }
  1016.         }
  1017.         wbp.saveURI(uri, null, null, null, "", file); 
  1018.     }//if
  1019. }//febeDownloadBox()
  1020.         
  1021. function febeCancelDownload(){
  1022.     Application.storage.set("created", "N/A");
  1023.     Application.storage.set("name", "N/A");
  1024.     Application.storage.set("location", "N/A");
  1025.     Application.storage.set("abort", true);
  1026.     return true;
  1027. }//febeCancelDownload()
  1028.  
  1029. function febeSelectItem(){
  1030.     var tree = document.getElementById("boxNetTree");
  1031.     var selection = tree.currentIndex;
  1032.     if(selection < 2){return false;}    // Can't select first two folders
  1033.     var d = document.getElementById("RestoreBox");
  1034.     d.disabled = false;
  1035.     return true;
  1036. }//febeSelectItem()
  1037.  
  1038. function febeOpenBoxUploadWindow(){
  1039.     febeDispBoxUploadWindow = febePrefs.getBoolPref("extensions.febe.boxnet.uploadwindow");
  1040.     if(febeDispBoxUploadWindow){
  1041.         window.openDialog('chrome://febe/content/BoxUpload.xul','FEBE upload', 'chrome,alwaysRaised,centerscreen,resizable,minimizable,height=500,width=500',febeMsg);
  1042.     }else{
  1043.         var statusSave = febePrefs.getBoolPref("dom.disable_window_status_change");
  1044. alert(febeStatusSave+"\n"+typeof febeStatusSave)
  1045.         if(febeStatusSave){febePrefs.setBoolPref("dom.disable_window_status_change", false);}
  1046.         setTimeout('febeUploadBackup();',2000);
  1047.     }//if
  1048. }//febeOpenBoxUploadWindow()
  1049.  
  1050. function febeGetBoxRootDir(){
  1051.     var prefName = "extensions.febe.boxnet.rootdir";
  1052.     var folderName = febePrefs.getCharPref(prefName);
  1053.     return folderName;
  1054. }//febeGetBoxRootDir()
  1055.  
  1056. function febeSetBoxRootDir(){
  1057.     if(!febePrefs.getBoolPref("extensions.febe.boxnet.enabled")){return true;}
  1058.     var prefName = "extensions.febe.boxnet.rootdir";
  1059.     var folderName = document.getElementById("bn.rootdir").value;
  1060.     var retVal = febeCheckBoxRootDir(folderName)
  1061.     if(retVal == "string"){
  1062.         febePrefs.setCharPref("extensions.febe.boxnet.rootdir",folderName);
  1063.     }else{
  1064.         return retVal;
  1065.     }//if
  1066.     return true;
  1067. }//febeSetBoxRootDir()
  1068.  
  1069. function febeCheckBoxRootDir(folderName){
  1070.     var badChars = '\\/:*?"<>|';
  1071.     for(var i=0; i<badChars.length; i++){
  1072.         if(folderName.indexOf(badChars[i]) != -1){
  1073.             var tmp="<style>color: red; font-weight: bold; font-size: 12px;</style>"+febeMsg[309];
  1074.             febeAlert(tmp);
  1075.             return false;
  1076.         }//if
  1077.     }//for
  1078.     if(folderName.substr(0,1) == " "){
  1079.         var tmp="<style>color: red; font-weight: bold; font-size: 12px;</style>"+febeMsg[308];
  1080.         febeAlert(tmp);
  1081.         return false;
  1082.     }//if
  1083.     if(folderName.length < 1){
  1084.         var tmp="<style>color: red; font-weight: bold; font-size: 12px;</style>"+febeMsg[307];
  1085.         febeAlert(tmp);
  1086.         folderName = febeResetPref("extensions.febe.boxnet.rootdir");
  1087.         return folderName;
  1088.     }//if
  1089.  
  1090.     return true;
  1091. }//febeCheckBoxRootDir()